package com.study.aop.theory.myaopdemo;

import com.study.aop.theory.myaop.*;
import com.study.aop.theory.service.KtvService;
import com.study.aop.theory.service.SpaService;
import com.study.aop.theory.service.impl.KtvPrincessB;
import com.study.aop.theory.service.impl.SpaPrincessA;

/**
 * @author: chenhs
 * @date: Created in 15:13 2019/12/8
 **/
public class AopMain {

    public static void main(String[] args) throws Throwable {

        //使用者提供的增强逻辑、切入点都有了；即切面。
        Advice advice = new TimeCsAdvice();
        Pointcut pointcut = new Pointcut("com\\.study\\.aop\\.theory\\.service\\..*", ".*Massage");
        Aspect aspect = new Aspect(advice, pointcut);

        //至此 用户要干的事情干完了（给出切面），该我们完成框架的功能了（使用切面生效）。
        //SpaService spa = new SpaPrincessA();
        //spa.aromaOilMassage("mike");


        /**
         * 如果要玩AOP，不能让用户主动new对象；需要一个工厂来负责提供对象 需要一个IOC
         *
         * IOC是AOP的基石
         */
        /*IocContainer ioc = new IocContainer();
        ioc.addBeanDefinition("spa", SpaPrincessA.class);
        ioc.addBeanDefinition("ktv", KtvPrincessB.class);
        ioc.setAspect(aspect);
        */

        ApplicationContext context = new MikeApplicationContext();
        context.registerBeanDefinition("spa", SpaPrincessA.class);
        context.registerBeanDefinition("ktv", KtvPrincessB.class);
        context.setAspect(aspect);

        SpaService spa = (SpaService) context.getBean("spa");
        spa.aromaOilMassage("mike");

        KtvService ktv = (KtvService) context.getBean("ktv");
        ktv.momoSing("mike");


    }

}
